# 4.9 二维码 识别

## 4.9.1 算法简介

![](./media/21.png)

可以识别一个简单的二维码并返回该二维码的坐标、大小及文本内容。二维码信息不超过25个字符，屏幕上可显示ASCII码字符，如果是中文二维码，则无法正常显示，但识别结果可由主控正常读取。

-------------

## 4.9.2 返回数据

该算法的返回数据包括二维码位置坐标和宽度。

|     参数     |     属性信息      |
| :----------: | :---------------: |
|   kXValue    | 二维码中心横坐标x |
|   kYValue    | 二维码中心纵坐标y |
| kWidthValue  |    二维码宽度w    |
| kHeightValue |    二维码高度h    |

代码：

```python
    # Sengo2只可识别并解码一个由不超过10个字符生成的二维码；所以返回结果非0时，只要获取并处理第1个结果的相关数据即可
    if obj_num:
        x = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kXValue, 1)
        y = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kYValue, 1)
        w = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kWidthValue, 1)
        h = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kHeightValue, 1)
        value = sengo2.GetQrCodeValue()
        #print((sengo2.GetQrCodeValue()))
        print("x=%d, y=%d, w=%d, h=%d, value=%s"%(x, y, w, h,value))
```

----------

## 4.9.3 如何生成二维码

我们有提供5个纸质的二维码卡片，二维码内容分别是“Red”，“Green”，“Blue”，“White”，“Black”。

![](./media/20.png)

如果我们提供的二维码满足不了你的需求，你可以通过下方的链接自己生成你需要的二维码。

[在线二维码生成器](https://cli.im/text/other)

进入链接后：

①选择文本

②输入需要生成的文字（注意避免中文字符与字符不得超过25个）

③点击生成二维码

④点击下载二维码图片

![b15](./media/b15.png)

------------

## 4.9.4 代码

```python
from machine import I2C,UART,Pin
from  Sengo2  import *
import time

# 等待Sengo2完成操作系统的初始化。此等待时间不可去掉，避免出现Sengo2尚未初始化完毕主控器已经开发发送指令的情况
time.sleep(2)

# 选择UART或者I2C通讯模式，Sengo2出厂默认为I2C模式，短按模式按键可以切换
# 4种UART通讯模式：UART9600（标准协议指令），UART57600（标准协议指令），UART115200（标准协议指令），Simple9600（简单协议指令），
#########################################################################################################
# port = UART(2,rx=Pin(16),tx=Pin(17),baudrate=9600)
port = I2C(0,scl=Pin(21),sda=Pin(20),freq=400000)

# Sengo2通讯地址：0x60。如果I2C总线挂接多个设备，请避免出现地址冲突
sengo2 = Sengo2(0x60)

err = sengo2.begin(port)
print("sengo2.begin: 0x%x"% err)

 
# 1、Sengo2只能识别并解码一个由不超过10个字符生成的二维码；
# 2、Apriltag与二维码不同，请勿混淆。二者在使用时，周围一圈均需要留白；
# 3、正常使用时，应由主控器发送指令控制Sentry2算法的开启与关闭，而非通过摇杆手动进行操作；
# 4、满足特定限制条件下，Sentry2可以并行运行多个识别算法；
err = sengo2.VisionBegin(sengo2_vision_e.kVisionQrCode)
print("sengo2.VisionBegin(sengo2_vision_e.kVisionQrCode):0x%x"% err)

while True:
    # Sengo2不主动返回检测识别结果，需要主控板发送指令进行读取。读取的流程：首先读取识别结果的数量，接收到指令后，Sengo2会刷新结果数据，如果结果数量不为零，那么主控再发送指令读取结果的相关信息。请务必按此流程构建程序。
    obj_num = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kStatus)
    # Sengo2只可识别并解码一个由不超过10个字符生成的二维码；所以返回结果非0时，只要获取并处理第1个结果的相关数据即可
    if obj_num:
        x = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kXValue, 1)
        y = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kYValue, 1)
        w = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kWidthValue, 1)
        h = sengo2.GetValue(sengo2_vision_e.kVisionQrCode, sentry_obj_info_e.kHeightValue, 1)
        value = sengo2.GetQrCodeValue()
        #print((sengo2.GetQrCodeValue()))
        print("x=%d, y=%d, w=%d, h=%d, value=%s"%(x, y, w, h,value))
        time.sleep(0.2)


```

-------

## 4.9.5 代码结果

上传代码后，AI视觉模块将会对摄像头拍到的地方进行分析如果有二维码就会进行识别，并且在串口监视器中打印二维码尺寸以及二维码的内容。

![](./media/21.png)

![](./media/b11.png)

## 4.9.6 扩展玩法

**多功能指令卡**

- **玩法简介：** 制作一系列二维码，内容不是网址，而是直接写入控制指令（如`LED_ON`, `SERVO_90`）。扫描不同二维码，直接控制硬件执行动作。
- **实现：** 编程解析扫描到的字符串，直接将其作为命令执行。这是一种无需键盘输入的硬件控制方式。